#include "ManejadorDistrito.h"

using namespace Manejadores;

ManejadorDistrito::ManejadorDistrito() {
	Configuracion* config = config->getInstancia();
	string pathDelArchivo = config->getNombreArchivoDistrito();
	this->distritos = new ArchivoDeEstructurasVariables(pathDelArchivo);
	this->indicePorUnicidad = new HashExtensible("IndicePorUnicidadDistrito");
}

bool ManejadorDistrito::alta(Distrito* distrito) {

	string clavePorUnicidad = distrito->getNombre();
	if (!indicePorUnicidad->existe(clavePorUnicidad)) {
		unsigned int posicionDelRegistro = distritos->insertar(distrito);
		indicePorUnicidad->insertar(clavePorUnicidad, posicionDelRegistro);

		indicePorUnicidad->exportarTxt("IndicePorUnicidadDistrito");
		return true;
	} else
		return false;
}

bool ManejadorDistrito::baja(Distrito* distrito) {
	string clavePorUnidicidad = distrito->getNombre();
	IRegistroIndice* aBorrar = indicePorUnicidad->buscar(clavePorUnidicidad);
	if (aBorrar->getOffsets()->size() > 0) {
		distritos->borrar(distrito, aBorrar->getOffsets()->at(0));
		indicePorUnicidad->eliminar(clavePorUnidicidad, aBorrar->getOffsets()->at(0));

		indicePorUnicidad->exportarTxt("IndicePorUnicidadDistrito");
		return true;
	} else
		return false;
}

bool ManejadorDistrito::modificacion(Distrito* distrito, Distrito* distritoNuevo) {

	string clavePorUnidicidad = distrito->getNombre();
	IRegistroIndice* viejaPosicion = indicePorUnicidad->buscar(clavePorUnidicidad);
	unsigned int nuevaPosicion = distritos->modificar(distritoNuevo, viejaPosicion->getOffsets()->at(0));
	if (viejaPosicion->getOffsets()->at(0) != nuevaPosicion) {
		indicePorUnicidad->eliminar(clavePorUnidicidad, viejaPosicion->getOffsets()->at(0));
		//indicePorUnicidad->modificar(clavePorUnidicidad,viejaPosicion->getOffsets()->at(0),nuevaPosicion);
		indicePorUnicidad->insertar(distritoNuevo->getNombre(), nuevaPosicion);
		indicePorUnicidad->exportarTxt("IndiceUnidadDistrito");
		return true;
	} else
		return false;
}

bool ManejadorDistrito::existe(string nombreDistrito) {
	return this->indicePorUnicidad->existe(nombreDistrito);
}

bool ManejadorDistrito::listarTodos() {
	bool toReturn = false;
	fstream txtFile;
	Configuracion* config = Configuracion::getInstancia();
	string path = config->getPathReportes() + "ListadoDistritos.txt";
	txtFile.open(path.c_str(), ios::out);
	if (txtFile.bad()) {
		txtFile.open(path.c_str(), ios::out);
	}
	txtFile << "Distrito			" << endl;
	txtFile << "=============================" << endl;

	vector<unsigned int>* offsets = this->indicePorUnicidad->getTodosLosDatos();
	if (!offsets->empty()) {
		Distrito* distrito = new Distrito();
		for (unsigned int i = 0; i < offsets->size(); ++i) {
			this->distritos->leer(distrito, offsets->at(i));
			txtFile << distrito->getNombre() << endl;
		}
		delete distrito;
		toReturn = true;
	} else {
		toReturn = false;
	}
	txtFile.close();
	return toReturn;
}

ManejadorDistrito::~ManejadorDistrito() {
	delete distritos;
	delete indicePorUnicidad;
}
